package com.j.lemon.learn.basic.codeTraining;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CodeTrainingDay01 {
    //题目：古典问题：有一对兔子，从出生后第3个月起每个月都生一对兔子，小兔子长到第三个月后每个月又生一对兔子，假如兔子都不死，问每个月的兔子对数为多少？
    //分析 : 1、1、2、3、5、8...

    @Test
    void test1(){
//        System.out.println(tuzi(6));
//        System.out.println(100%2);
//        sushu();
//        shuixianhua();
//        fenjiezhiyinshu(36);
//        tiaojianqiantao(90);
//        gongyuegongbei(33,55);
//        tongji("   12qewAAA902   !@##@!$ ");
    }



    Integer tuzi (Integer monnth){
        if(monnth<3){
            return 1;
        }else{
            return tuzi(monnth-1)+tuzi(monnth-2);
        }
    }
    //题目：判断101-200之间有多少个素数，并输出所有素数。
    public void sushu(){
        int count = 0;
        loop:for(int i =101;i<201;i++){
            for(int j=2;j<i;j++){
                if(i % j ==0){
                    continue loop;
                }
            }
            count++;
            System.out.println(i);
        }
        System.out.println(count);
    }
    //题目：打印出所有的"水仙花数"，所谓"水仙花数"是指一个三位数，其各位数字立方和等于该数本身。例如：153是一个"水仙花数"，因为153=1的三次方＋5的三次方＋3的三次方。
    void shuixianhua(){
        for(int i =100;i<1000;i++){
            char[] chars = String.valueOf(i).toCharArray();
            int v = (int) (Math.pow(Integer.parseInt(String.valueOf(chars[0])), 3) + Math.pow(Integer.parseInt(String.valueOf(chars[1])), 3) + Math.pow(Integer.parseInt(String.valueOf(chars[2])), 3));
            if(v==i){
                System.out.println(i);
            }
        }
    }
    //题目：将一个正整数分解质因数。例如：输入90,打印出90=2*3*3*5。
    void fenjiezhiyinshu(int num){
        boolean flag = false;
        for(int i =2;i<num;i++){
            if(num % i ==0){
                System.out.println(i);
                flag=true;
                fenjiezhiyinshu(num/i);
                break;
            }
        }
        if(!flag){
            System.out.println(num);
        }
    }
    //题目：利用条件运算符的嵌套来完成此题：学习成绩>=90分的同学用A表示，60-89分之间的用B表示，60分以下的用C表示。
    void tiaojianqiantao(int num){
        String str=num>=90?"分，属于A等":(num>=60?"分，属于B等":"分，属于C等");
        System.out.println(num+str);
    }
    //题目：输入两个正整数m和n，求其最大公约数和最小公倍数
    //思路: 最大公约数：先找出两个数中大的那个数字，然后循环取余，如果可以整除，再用小的除以该数看能不能整除，能整除说明这个是公约数，循环赋值即可找到最大公约数
    //     最小公倍数：先找出大的那个数字，循环乘以2以上的数字，每次都除以小的那个数看能否整除，如果能够整除，则说明该数是最小公倍数

    void gongyuegongbei(int m,int n){
        Integer zuidagongyue = null;

        int num =m>n?m:n;
        boolean flag = false;
        if(m>n){
            flag=true;
        }
        for(int i=2;i<num;i++){
            if(num%i==0){
                if(flag&&n%i==0){
                    zuidagongyue=i;
                }else if(!flag&&m%i==0){
                    zuidagongyue=i;
                }
            }
        }
        System.out.println("最大公约数:"+zuidagongyue);
    }
    //题目：输入一行字符，分别统计出其中英文字母、空格、数字和其它字符的个数。
    public void tongji(String str){
        int zimu=0,shuzi=0,kongge=0,qita=0;
        char chars [] =str.toCharArray();
        for(char c : chars){
            if(Character.isDigit(c)){
                shuzi++;
            }else if(Character.isSpaceChar(c)){
                kongge++;
            }else if(c>=65&&c<=90 || c>=97&&c<=122){
                zimu++;
            }else{
                qita++;
            }
        }
        System.out.println("字母："+zimu+",数字："+shuzi+",空格："+kongge+",其他："+qita);

    }
    //题目：求s=a+aa+aaa+aaaa+aa...a的值，其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加)，几个数相加有键盘控制。
    //题目：一个数如果恰好等于它的因子之和，这个数就称为"完数"。例如6=1＋2＋3.编程找出1000以内的所有完数。
    //题目：一球从100米高度自由落下，每次落地后反跳回原高度的一半；再落下，求它在第10次落地时，共经过多少米？第10次反弹多高？

}
